﻿using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data;
using System.Text;
using Sinacor.Infra.Service.Data;
using PSE.ProcessManager.Server.Process.Security;
using Sinacor.Infra.Core.ProcessManager.Server.Security;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Process.Bovespa.Financeiro.Server.ResourceAccess
{
    public class Exportacao : BaseResourceAccess
    {
        #region Contrutor

        public Exportacao()
            : base(AuthenticationContext<SinacorAuthenticationData>.Current.AuthenticationData.CompanyId)
        {
        }

        #endregion

        #region Métodos Públicos

        public int ObterCodigoEmpresaBolsa()
        {
            int retorno;

            string sqlCommand = @"SELECT TO_NUMBER(CD_EMPR_BOLSA)
                                  FROM TGELOCAL
                                  WHERE CD_EMPRESA = :CompanyId
                                        AND CD_BOLSA = 1 ";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                this.DataBase.AddInParameter(command, "CompanyId", DbType.Int32, AuthenticationContext<SinacorAuthenticationData>.Current.AuthenticationData.CompanyId);

                retorno = Convert.ToInt32(this.DataBase.ExecuteScalar(command));
            }

            return retorno;
        }

        public List<ProcessEntity.Financeiro> ConsultarFinanceiro(ProcessEntity.Parameter.FiltroExportacaoFinanceiro entity)
        {
            List<ProcessEntity.Financeiro> retorno = null;
            string sqlCommand;
            StringBuilder query = new StringBuilder();

            query.Append(@"SELECT  
                                       A.DT_DATMOV DataMovimento,  
                                       A.DT_NEGOCIO DataNegocio,    
                                       A.CD_BOLFAT BolsaFaturamento,      
                                       A.CD_CLIENTE CodigoCliente,
                                       A.DV_CLIENTE DigitoCliente,
                                       A.NM_CLIENTE NomeCliente,
                                       A.CD_CLIENTE_BRO CodigoClienteBroker,
                                       A.CD_CLIENTE_FIN CodigoClienteLiquidante,
                                       A.NM_CLIENTE_FIN NomeClienteLiquidante,
                                       A.CD_ASSESSOR CodigoAssessor,
                                       A.NM_ASSESSOR NomeAssessor, 
                                       A.PC_COMISSAO_ASS PercComissaoAssessor,
                                       A.CD_AGENTE CodigoAgente,
                                       A.NM_AGENTE NomeAgente,
                                       A.PC_COMISSAO_AGE PercComissaoAgente,
                                       A.CD_CORRESP CodigoCorrespondente,
                                       A.CD_NEGOCIO CodigoAtivo,
                                       A.NR_NEGOCIO NumeroNegocio,
                                       A.CD_NATOPE NaturezaOperacao,
                                       A.CD_CARLIQ Carteira,
                                       A.QT_QTDESP Quantidade,
                                       A.VL_NEGOCIO PrecoNegocio,
                                       A.VL_TOTNEG VolumeNegocio,
                                       A.VL_TAXANA ValTaxaAna,
                                       A.VL_VALDES ValDespesa,
                                       A.VL_IRCORR ValIRRFCorretagem,
                                       A.VL_COMASS ValComissaoAssessor,
                                       A.VL_AGENTE ValComissaoAgente,
                                       A.VL_CORRESP ValCorrespondente,
                                       abs(A.VL_DESCON) ValDescontoCliente,
                                       A.VL_CORTOT ValCorretagem,
                                       A.VL_TAXREG ValTaxaRegistro,
                                       A.VL_TAXREG_BV ValTaxaRegistroBovespa,   
                                       A.VL_TAXREG_CB ValTaxaRegistroCBLC,   
                                       A.VL_EMOLUM ValEmol,
                                       A.VL_EMOLUM_BV ValEmolBovespa,
                                       A.VL_EMOLUM_CB ValEmolCBLC,
                                       nvl(A.IN_NEGOCIO,' ') IndNegocio,
                                       nvl(A.IN_QUALIFICADO,' ') IndClienteQualificado,
                                       nvl(A.IN_LIQUIDA,' ') IndTipoLiquidacao,
                                       decode( C.ID_LIQUID, 0, B.DT_MOV, 1, B.PZ_LIQ_FUT, B.PZ_PROJ_CC ) DataLiquidacao,
                                       A.VL_BASEIRDT ValBaseIRRF,
                                       A.VL_IRRETIDO ValIRRF,
                                       C.FT_VALORIZACAO FatorValorizacao,
                                       A.VL_ISS ValISS,
                                       A.VL_ISS_CORRESP ValISSCorresp,
                                       A.CD_MUNICIPIO Município,
                                       A.VL_CORTOT_ORI CorretagemOriginal,
                                       A.TP_NEGOCIO TipoNegocioOrderBy
                                  FROM 
                                       TBOMOVCLI A,
                                       TBOCALE B,
                                       TORNEGD C,
                                       TBOPARAM D ");


            if (entity.TipoFormatoFinanceiro == ProcessEntity.Enum.TipoFormatoFinanceiro.Clubes)
            {
                query.Append(@",
                                       V_TGACLUBE X ");
            }

            query.Append(@"WHERE
                                       A.DT_NEGOCIO  = :DataPregao
                                       AND A.DT_NEGOCIO  = B.DT_MOV
                                       AND A.CD_BOLFAT   = B.CD_PRACA
                                       AND A.DT_NEGOCIO  = C.DT_PREGAO
                                       AND A.CD_NEGOCIO  = C.CD_NEGOCIO
                                       AND A.CD_NATOPE   = C.CD_NATOPE
                                       AND A.CD_BOLSAMOV = C.CD_BOLSAMOV
                                       AND A.NR_NEGOCIO  = C.NR_NEGOCIO ");

            if (entity.TipoFormatoFinanceiro == ProcessEntity.Enum.TipoFormatoFinanceiro.Clubes)
            {
                query.Append(" AND X.CD_CLIENTE = A.CD_CLIENTE ");
            }
            else
            {
                query.Append(" AND A.CD_CLIENTE_BRO = :CodigoBroker ");

                if (entity.CodigoCliente.HasValue)
                {
                    query.Append(" AND A.CD_CLIENTE = :CodigoCliente ");
                }
            }

            sqlCommand = String.Concat(query,
                                       @" AND A.DT_NEGOCIO < D.DT_DATMOV
                                          AND NOT EXISTS ( SELECT 0
                                                           FROM TBOCTRMOV E
                                                           WHERE E.DT_NEGOCIO = A.DT_NEGOCIO
                                                                 AND E.CD_BOLFAT  = A.CD_BOLFAT
                                                                 AND E.CD_CLIENTE = A.CD_CLIENTE
                                                                 AND E.TP_NEGOCIO = A.TP_NEGOCIO
                                                                 AND E.DT_DATMOV  = A.DT_DATMOV
                                                                 AND E.ID_DIA = 'EST' )
                                          UNION ALL ",
                                       query,
                                       @" AND A.DT_NEGOCIO = D.DT_DATMOV 
                                         ORDER BY 
                                                DataNegocio,
                                                CodigoCliente,
                                                BolsaFaturamento,
                                                TipoNegocioOrderBy,
                                                CodigoAtivo,
                                                NumeroNegocio,
                                                NaturezaOperacao");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                this.DataBase.AddInParameter(command, "DataPregao", DbType.Date, entity.DataPregao.Value);

                if (entity.TipoFormatoFinanceiro == ProcessEntity.Enum.TipoFormatoFinanceiro.Broker)
                {
                    this.DataBase.AddInParameter(command, "CodigoBroker", DbType.Int32, entity.CodigoBroker.Value);

                    if (entity.CodigoCliente.HasValue)
                    {
                        this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente.Value);
                    }
                }

                retorno = this.FindAll<ProcessEntity.Financeiro>(command, ConstruirFinanceiro);
            }

            return retorno;
        }

        public List<ProcessEntity.Financeiro> ConsultarFinanceiroPosMontagemFinanceiroAnaliticoFAX(ProcessEntity.Parameter.FiltroExportacaoFinanceiro entity)
        {
            List<ProcessEntity.Financeiro> retorno = null;
            StringBuilder sqlCommand = new StringBuilder();

            sqlCommand.Append(@"SELECT  
                                       A.DT_DATMOV DataMovimento,  
                                       A.DT_NEGOCIO DataNegocio,    
                                       A.CD_BOLFAT BolsaFaturamento,      
                                       A.CD_CLIENTE CodigoCliente,
                                       D.DV_CLIENTE DigitoCliente,
                                       E.NM_CLIENTE NomeCliente,
                                       A.CD_CLIENTE_BRO CodigoClienteBroker,
                                       A.CD_CLIENTE_CC CodigoClienteLiquidante,
                                       ' '  NomeClienteLiquidante,
                                       D.CD_ASSESSOR CodigoAssessor,
                                       F.NM_ASSESSOR NomeAssessor, 
                                       0 PercComissaoAssessor,
                                       D.CD_AGENTE CodigoAgente,
                                       G.NM_AGENTE NomeAgente,
                                       0 PercComissaoAgente,
                                       C.CD_CORRESP CodigoCorrespondente,
                                       A.CD_NEGOCIO CodigoAtivo,
                                       A.NR_NEGOCIO NumeroNegocio,
                                       A.CD_NATOPE NaturezaOperacao,
                                       A.CD_CARLIQ Carteira,
                                       A.QT_QTDESP Quantidade,
                                       C.VL_NEGOCIO PrecoNegocio,
                                       A.VL_TOTNEG VolumeNegocio,
                                       0 ValTaxaAna,
                                       A.VL_VALDES ValDespesa,
                                       0 ValIRRFCorretagem,
                                       0 ValComissaoAssessor,
                                       0 ValComissaoAgente,
                                       0 ValCorrespondente,
                                       abs(A.VL_CORTOT-A.VL_CORRET) ValDescontoCliente,
                                       A.VL_CORRET ValCorretagem,
                                       A.VL_TXREG ValTaxaRegistro,
                                       A.VL_TXREG_BV ValTaxaRegistroBovespa,   
                                       A.VL_TXREG_CB ValTaxaRegistroCBLC,   
                                       A.VL_EMOLUM ValEmol,
                                       A.VL_EMOLUM_BV ValEmolBovespa,
                                       A.VL_EMOLUM_CB ValEmolCBLC,
                                       nvl(A.IN_NEGOCIO,' ') IndNegocio,
                                       nvl(A.IN_QUALIFICADO,' ') IndClienteQualificado,
                                       nvl(A.IN_LIQUIDA,' ') IndTipoLiquidacao,
                                       decode( C.ID_LIQUID, 0, B.DT_MOV, 1, B.PZ_LIQ_FUT, B.PZ_PROJ_CC ) DataLiquidacao,
                                       A.VL_BASEIRDT ValBaseIRRF,
                                       A.VL_IRRETIDO ValIRRF,
                                       C.FT_VALORIZACAO FatorValorizacao,
                                       0 ValISS,
                                       0  ValISSCorresp,
                                       NULL Município,
                                       0 CorretagemOriginal 
                                FROM 
                                       TBODETFIN01 A, 
                                       TBOCALE B, 
                                       TORNEGD C, 
                                       TSCCLIBOL D, 
                                       TSCCLIGER E, 
                                       TSCASSES F, 
                                       TSCAGENTE G, 
                                       TSCCBASAG H");

            if (entity.TipoFormatoFinanceiro == ProcessEntity.Enum.TipoFormatoFinanceiro.Clubes)
            {
                sqlCommand.Append(@",
                                      V_TGACLUBE x");
            }

            sqlCommand.Append(@" WHERE
                                      A.DT_NEGOCIO  = :DataPregao
                                      AND A.DT_NEGOCIO  = B.DT_MOV
                                      AND A.CD_BOLFAT   = B.CD_PRACA
                                      AND A.DT_NEGOCIO  = C.DT_PREGAO
                                      AND A.CD_NEGOCIO  = C.CD_NEGOCIO
                                      AND A.CD_NATOPE   = C.CD_NATOPE
                                      AND A.CD_BOLSAMOV = C.CD_BOLSAMOV
                                      AND A.NR_NEGOCIO  = C.NR_NEGOCIO");

            if (entity.TipoFormatoFinanceiro == ProcessEntity.Enum.TipoFormatoFinanceiro.Clubes)
            {
                sqlCommand.Append(" AND X.CD_CLIENTE = A.CD_CLIENTE ");
            }
            else
            {
                sqlCommand.Append(" AND A.CD_CLIENTE_BRO = :CodigoBroker ");

                if (entity.CodigoCliente.HasValue)
                {
                    sqlCommand.Append(" AND A.CD_CLIENTE = :CodigoCliente ");
                }
            }

            sqlCommand.Append(@"      AND D.CD_CLIENTE   = A.CD_CLIENTE
                                      AND E.CD_CPFCGC    = D.CD_CPFCGC
                                      AND E.DT_NASC_FUND = D.DT_NASC_FUND
                                      AND E.CD_CON_DEP   = D.CD_CON_DEP
                                      AND F.CD_ASSESSOR  = D.CD_ASSESSOR
                                      AND G.CD_AGENTE    = H.CD_AGENTE
                                      AND H.CD_CLIENTE   = D.CD_CLIENTE
                                      AND H.IN_PRINCIPAL = 'S'
                                      AND A.NM_ESTACAO   = :ComputerName
                                      AND A.DT_SISTEMA   = TO_DATE( :DataMontagemAnaliticoFAX, 'YYYYMMDDHH24MISS' )
                                ORDER BY
                                      A.DT_NEGOCIO,  
                                      A.CD_CLIENTE, 
                                      A.CD_BOLSAMOV,
                                      A.CD_NEGOCIO, 
                                      A.NR_NEGOCIO, 
                                      A.CD_NATOPE");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataPregao", DbType.Date, entity.DataPregao.Value);
                this.DataBase.AddInParameter(command, "ComputerName", DbType.String, (entity.MaquinaUsuario.Length > 15)
                                                                                                ? entity.MaquinaUsuario.Substring(0, 15)
                                                                                                : entity.MaquinaUsuario);
                this.DataBase.AddInParameter(command, "DataMontagemAnaliticoFAX", DbType.String, entity.DataMontagemAnaliticoFAX);

                if (entity.TipoFormatoFinanceiro == ProcessEntity.Enum.TipoFormatoFinanceiro.Broker)
                {
                    this.DataBase.AddInParameter(command, "CodigoBroker", DbType.Int32, entity.CodigoBroker.Value);

                    if (entity.CodigoCliente.HasValue)
                    {
                        this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente.Value);
                    }
                }

                retorno = this.FindAll<ProcessEntity.Financeiro>(command, ConstruirFinanceiro);
            }

            return retorno;
        }

        public bool VerificarMovimentoFechado()
        {
            bool retorno = false;

            string sqlCommand = @"SELECT TP_MOVIMENTO TipoMovimento
                                  FROM TBOPARAM";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                retorno = (this.DataBase.ExecuteScalar(command).ToString() == "F");
            }

            return retorno;
        }

        public bool VerificarMovimentoBrokers(ProcessEntity.Parameter.FiltroExportacaoFinanceiro entity)
        {
            bool retorno = false;

            string sqlCommand = @"SELECT COUNT(0) as Quantidade
                                  FROM TBOMOVCLI
                                  WHERE CD_CLIENTE_BRO = :CodigoBroker
                                        AND IN_CORRESP = 'N'
                                        AND DT_NEGOCIO = :DataPregao";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                this.DataBase.AddInParameter(command, "CodigoBroker", DbType.Int32, entity.CodigoBroker.Value);
                this.DataBase.AddInParameter(command, "DataPregao", DbType.Date, entity.DataPregao.Value);

                retorno = (Convert.ToInt32(this.DataBase.ExecuteScalar(command)) > 0);
            }

            return retorno;
        }

        public bool VerificarMovimentoCliente(ProcessEntity.Parameter.FiltroExportacaoFinanceiro entity)
        {
            bool retorno = false;

            string sqlCommand = @"SELECT COUNT(0) as Quantidade
                                  FROM TBOMOVCLI
                                  WHERE CD_CLIENTE_BRO = :CodigoBroker
                                        AND IN_CORRESP = 'N'
                                        AND DT_NEGOCIO = :DataPregao
                                        AND CD_CLIENTE = :CodigoCliente";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                this.DataBase.AddInParameter(command, "CodigoBroker", DbType.Int32, entity.CodigoBroker.Value);
                this.DataBase.AddInParameter(command, "DataPregao", DbType.Date, entity.DataPregao.Value);
                this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente.Value);

                retorno = (Convert.ToInt32(this.DataBase.ExecuteScalar(command)) > 0);
            }

            return retorno;
        }

        public ProcessEntity.Resultado RealizarMontagemFinanceiroAnaliticoFAX(ProcessEntity.Parameter.FiltroMontagemFAX entity)
        {
            ProcessEntity.Resultado retorno = null;
            StringBuilder sqlCommand = new StringBuilder();

            sqlCommand.Append(" DECLARE rettype BOOLEAN; ");
            sqlCommand.Append(" BEGIN ");
            sqlCommand.Append(" rettype:= PBO_FAX.fBO_FAX (:CodigoBroker, :DataPregao1, :DataPregao2, :IndicadorBroker, :DataMontagemAnaliticoFAX, :ComputerName, :TipoChamada, :R_nErro, :R_sErro, :R_sArgs); ");
            sqlCommand.Append(" IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sqlCommand.Append(" END; ");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand.ToString()))
            {
                this.DataBase.AddInParameter(command, "CodigoBroker", DbType.Int32, entity.CodigoBroker);
                this.DataBase.AddInParameter(command, "DataPregao1", DbType.String, entity.DataPregao.ToString("dd-MM-yyyy"));
                this.DataBase.AddInParameter(command, "DataPregao2", DbType.String, entity.DataPregao.ToString("dd-MM-yyyy"));
                this.DataBase.AddInParameter(command, "IndicadorBroker", DbType.String, entity.IndicadorBroker);
                this.DataBase.AddInParameter(command, "DataMontagemAnaliticoFAX", DbType.String, entity.DataMontagemAnaliticoFAX);
                this.DataBase.AddInParameter(command, "ComputerName", DbType.String, (entity.MaquinaUsuario.Length > 15)
                                                                                               ? entity.MaquinaUsuario.Substring(0, 15)
                                                                                               : entity.MaquinaUsuario);
                this.DataBase.AddInParameter(command, "TipoChamada", DbType.String, String.Empty);


                this.DataBase.AddOutParameter(command, "R_nErro", DbType.Int32, 4);
                this.DataBase.AddOutParameter(command, "R_sErro", DbType.String, 1000);
                this.DataBase.AddOutParameter(command, "R_sArgs", DbType.String, 2000);
                this.DataBase.AddOutParameter(command, "R_Retorno", DbType.Int32, 4);

                this.DataBase.ExecuteNonQuery(command);

                retorno = new ProcessEntity.Resultado();

                if (Convert.ToBoolean(this.DataBase.GetParameterValue(command, "R_Retorno")))
                {
                    retorno.Sucesso = true;
                }
                else
                {
                    retorno.Sucesso = false;
                    retorno.CodigoErro = Convert.ToInt32(this.DataBase.GetParameterValue(command, "R_nErro"));
                    retorno.Argumentos = Convert.ToString(this.DataBase.GetParameterValue(command, "R_sArgs"));
                }
            }

            return retorno;
        }

        public List<ProcessEntity.Parameter.FiltroMontagemFAX> ConsultarBrokersPorClube(ProcessEntity.Parameter.FiltroExportacaoFinanceiro entity)
        {
            List<ProcessEntity.Parameter.FiltroMontagemFAX> retorno = null;

            string sqlCommand = @"SELECT DISTINCT
                                         DECODE( A.CD_CLIENTE - A.CD_CLIENTE_BRO, 0, DECODE( A.CD_CLIENTE - A.CD_CLIENTE_FIN, 0, A.CD_CLIENTE, A.CD_CLIENTE_FIN ), DECODE( A.CD_CLIENTE_BRO - A.CD_CLIENTE_FIN, 0, A.CD_CLIENTE_BRO, A.CD_CLIENTE_FIN ) ) CodigoCliente,
                                         DECODE( A.CD_CLIENTE - A.CD_CLIENTE_BRO, 0, DECODE( A.CD_CLIENTE - A.CD_CLIENTE_FIN, 0, 'C', 'F' ), DECODE( A.CD_CLIENTE_BRO - A.CD_CLIENTE_FIN, 0, 'B', 'F' ) ) IndicadorBroker
                                  FROM TORCOMI A,
			                           V_TGACLUBE B
	                              WHERE B.CD_CLIENTE = A.CD_CLIENTE
		                                AND A.DT_NEGOCIO = :DataPregao ";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                this.DataBase.AddInParameter(command, "DataPregao", DbType.Date, entity.DataPregao.Value);

                retorno = this.FindAll<ProcessEntity.Parameter.FiltroMontagemFAX>(command,
                                                                 reader =>
                                                                 {
                                                                     ProcessEntity.Parameter.FiltroMontagemFAX item = new ProcessEntity.Parameter.FiltroMontagemFAX();

                                                                     item.CodigoBroker = reader.GetValue<int>("CodigoCliente");
                                                                     item.IndicadorBroker = reader.GetValue<string>("IndicadorBroker");

                                                                     return item;
                                                                 });
            }

            return retorno;
        }

        #endregion

        #region Métodos Privados

        private ProcessEntity.Financeiro ConstruirFinanceiro(IDataReader reader)
        {
            ProcessEntity.Financeiro retorno = new ProcessEntity.Financeiro();

            retorno.DataMovimento = reader.GetValue<DateTime>("DataMovimento");
            retorno.BolsaFaturamento = EnumConverter.Parse<ProcessEntity.Enum.TipoBolsa>(reader.GetValue<string>("BolsaFaturamento"));
            retorno.CodigoCliente = reader.GetValue<int>("CodigoCliente");
            retorno.DigitoCliente = reader.GetValue<int>("DigitoCliente");

            if (reader["NomeCliente"] != null
                && reader["NomeCliente"] != DBNull.Value)
            {
                retorno.NomeCliente = reader.GetValue<string>("NomeCliente");
            }

            retorno.CodigoClienteBroker = reader.GetValue<int>("CodigoClienteBroker");
            retorno.CodigoClienteLiquidante = reader.GetValue<int>("CodigoClienteLiquidante");

            if (reader["NomeClienteLiquidante"] != null
                && reader["NomeClienteLiquidante"] != DBNull.Value)
            {
                retorno.NomeClienteLiquidante = reader.GetValue<string>("NomeClienteLiquidante");
            }

            retorno.CodigoAssessor = reader.GetValue<int>("CodigoAssessor");
            retorno.NomeAssessor = reader.GetValue<string>("NomeAssessor");
            retorno.PercentualComissaoAssessor = reader.GetValue<decimal>("PercComissaoAssessor");

            if (reader["CodigoAgente"] != null
                && reader["CodigoAgente"] != DBNull.Value)
            {
                retorno.CodigoAgente = reader.GetValue<int>("CodigoAgente");
            }

            retorno.NomeAgente = reader.GetValue<string>("NomeAgente");
            retorno.PercentualComissaoAgente = reader.GetValue<decimal>("PercComissaoAgente");
            retorno.CodigoCorrespondente = reader.GetValue<int>("CodigoCorrespondente");

            if (reader["CodigoAtivo"] != null
                && reader["CodigoAtivo"] != DBNull.Value)
            {
                retorno.CodigoAtivo = reader.GetValue<string>("CodigoAtivo");
            }

            retorno.NumeroNegocio = reader.GetValue<int>("NumeroNegocio");
            retorno.NaturezaOperacao = EnumConverter.Parse<ProcessEntity.Enum.TipoNaturezaOperacao>(reader.GetValue<string>("NaturezaOperacao"));
            retorno.Carteira = reader.GetValue<int>("Carteira");

            if (reader["Quantidade"] != null
                && reader["Quantidade"] != DBNull.Value)
            {
                retorno.Quantidade = reader.GetValue<decimal>("Quantidade");
            }

            if (reader["PrecoNegocio"] != null
                && reader["PrecoNegocio"] != DBNull.Value)
            {
                retorno.PrecoNegocio = reader.GetValue<decimal>("PrecoNegocio");
            }

            if (reader["VolumeNegocio"] != null
                && reader["VolumeNegocio"] != DBNull.Value)
            {
                retorno.VolumeNegocio = reader.GetValue<decimal>("VolumeNegocio");
            }

            if (reader["ValTaxaAna"] != null
                && reader["ValTaxaAna"] != DBNull.Value)
            {
                retorno.ValorTaxaAna = reader.GetValue<decimal>("ValTaxaAna");
            }

            if (reader["ValDespesa"] != null
                && reader["ValDespesa"] != DBNull.Value)
            {
                retorno.ValorDespesa = reader.GetValue<decimal>("ValDespesa");
            }

            if (reader["ValIRRFCorretagem"] != null
                && reader["ValIRRFCorretagem"] != DBNull.Value)
            {
                retorno.ValorIRRFCorretagem = reader.GetValue<decimal>("ValIRRFCorretagem");
            }

            if (reader["ValComissaoAssessor"] != null
                && reader["ValComissaoAssessor"] != DBNull.Value)
            {
                retorno.ValorComissaoAssessor = reader.GetValue<decimal>("ValComissaoAssessor");
            }

            if (reader["ValComissaoAgente"] != null
                && reader["ValComissaoAgente"] != DBNull.Value)
            {
                retorno.ValorComissaoAgente = reader.GetValue<decimal>("ValComissaoAgente");
            }

            if (reader["ValCorrespondente"] != null
                && reader["ValCorrespondente"] != DBNull.Value)
            {
                retorno.ValorCorrespondente = reader.GetValue<decimal>("ValCorrespondente");
            }

            if (reader["ValDescontoCliente"] != null
                && reader["ValDescontoCliente"] != DBNull.Value)
            {
                retorno.ValorDescontoCliente = reader.GetValue<decimal>("ValDescontoCliente");
            }

            if (reader["ValCorretagem"] != null
                && reader["ValCorretagem"] != DBNull.Value)
            {
                retorno.ValorCorretagem = reader.GetValue<decimal>("ValCorretagem");
            }

            if (reader["ValTaxaRegistro"] != null
                && reader["ValTaxaRegistro"] != DBNull.Value)
            {
                retorno.ValorTaxaRegistro = reader.GetValue<decimal>("ValTaxaRegistro");
            }

            if (reader["ValTaxaRegistroBovespa"] != null
                && reader["ValTaxaRegistroBovespa"] != DBNull.Value)
            {
                retorno.ValorTaxaRegistroBovespa = reader.GetValue<decimal>("ValTaxaRegistroBovespa");
            }

            if (reader["ValTaxaRegistroCBLC"] != null
                && reader["ValTaxaRegistroCBLC"] != DBNull.Value)
            {
                retorno.ValorTaxaRegistroCBLC = reader.GetValue<decimal>("ValTaxaRegistroCBLC");
            }

            if (reader["ValEmol"] != null
                && reader["ValEmol"] != DBNull.Value)
            {
                retorno.ValorEmolumento = reader.GetValue<decimal>("ValEmol");
            }

            if (reader["ValEmolBovespa"] != null
                && reader["ValEmolBovespa"] != DBNull.Value)
            {
                retorno.ValorEmolumentoBovespa = reader.GetValue<decimal>("ValEmolBovespa");
            }

            if (reader["ValEmolCBLC"] != null
                && reader["ValEmolCBLC"] != DBNull.Value)
            {
                retorno.ValorEmolumentoCBLC = reader.GetValue<decimal>("ValEmolCBLC");
            }

            retorno.IndicadorNegocio = reader.GetValue<string>("IndNegocio");
            retorno.IndicadorClienteQualificado = reader.GetValue<string>("IndClienteQualificado");
            retorno.IndicadorTipoLiquidacao = reader.GetValue<string>("IndTipoLiquidacao");
            retorno.DataLiquidacao = reader.GetValue<DateTime>("DataLiquidacao");

            if (reader["ValBaseIRRF"] != null
                && reader["ValBaseIRRF"] != DBNull.Value)
            {
                retorno.ValorBaseIRRF = reader.GetValue<decimal>("ValBaseIRRF");
            }

            if (reader["ValIRRF"] != null
                && reader["ValIRRF"] != DBNull.Value)
            {
                retorno.ValorIRRF = reader.GetValue<decimal>("ValIRRF");
            }

            if (reader["FatorValorizacao"] != null
                && reader["FatorValorizacao"] != DBNull.Value)
            {
                retorno.FatorValorizacao = reader.GetValue<decimal>("FatorValorizacao");
            }

            if (reader["ValISS"] != null
                && reader["ValISS"] != DBNull.Value)
            {
                retorno.ValorISS = reader.GetValue<decimal>("ValISS");
            }

            if (reader["ValISSCorresp"] != null
                && reader["ValISSCorresp"] != DBNull.Value)
            {
                retorno.ValorISSCorrespondente = reader.GetValue<decimal>("ValISSCorresp");
            }

            if (reader["Município"] != null
                && reader["Município"] != DBNull.Value)
            {
                retorno.Municipio = reader.GetValue<int>("Município");
            }

            if (reader["CorretagemOriginal"] != null
                && reader["CorretagemOriginal"] != DBNull.Value)
            {
                retorno.CorretagemOriginal = reader.GetValue<decimal>("CorretagemOriginal");
            }

            return retorno;
        }

        #endregion
    }
}
